home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / include / bf.h.32 < prev    next >
Text File  |  1990-09-17  |  4KB  |  132 lines

  1. /*
  2.  * bf.h --
  3.  *
  4.  *    Macros to manipulate bits in a string of bytes, simulating the
  5.  *    effect of bit fields.
  6.  *
  7.  * Copyright 1990 Regents of the University of California
  8.  * Permission to use, copy, modify, and distribute this
  9.  * software and its documentation for any purpose and without
  10.  * fee is hereby granted, provided that the above copyright
  11.  * notice appear in all copies.  The University of California
  12.  * makes no representations about the suitability of this
  13.  * software for any purpose.  It is provided "as is" without
  14.  * express or implied warranty.
  15.  *
  16.  * $Header: /sprite/lib/forms/RCS/proto.h,v 1.5 90/01/12 12:03:25 douglis Exp $ SPRITE (Berkeley)
  17.  */
  18.  
  19. #ifndef _BF
  20. #define _BF
  21.  
  22. #define BfMin(a, b)    ((a) < (b) ? (a) : (b))
  23.  
  24. #define BfMask(bits)   ((1 << (bits)) - 1)
  25.  
  26. #define BfDx(x, d)     (((x) == 0) ? (d) & 7 : 0)
  27.  
  28. #define BfS0(d, s)     (BfMin(8 - BfDx(0, d), s))
  29.  
  30. #define BfSumS0(d, s)  (BfS0(d, s))
  31.  
  32. #define BfS1(d, s)     (BfMin(8 - BfDx(1, d), (s) - BfSumS0(d, s)))
  33.  
  34. #define BfSumS1(d, s)  (BfS0(d, s) + BfS1(d, s))
  35.  
  36. #define BfS2(d, s)     (BfMin(8 - BfDx(2, d), (s) - BfSumS1(d, s)))
  37.  
  38. #define BfSumS2(d, s)  (BfSumS1(d, s) + BfS2(d, s))
  39.  
  40. #define BfS3(d, s)     (BfMin(8 - BfDx(3, d), (s) - BfSumS2(d, s)))
  41.  
  42. #define BfSumS3(d, s)  (BfSumS2(d, s) + BfS3(d, s))
  43.  
  44. #define BfS4(d, s)     (BfMin(8 - BfDx(4, d), (s) - BfSumS3(d, s)))
  45.  
  46. #define BfSumS4(d, s)  (BfSumS3(d, s) + BfS4(d, s))
  47.  
  48. #define BfSx(x, d, s)                         \
  49.     (((x) == 0) ? BfS0(d, s) : (((x) == 1) ? BfS1(d, s) :     \
  50.     (((x) == 2) ? BfS2(d, s) : (((x) == 3) ? BfS3(d, s) :    \
  51.     BfS4(d, s)))))
  52.  
  53. #define BfSumSx(x, d, s) \
  54.     (((x) == 0) ? BfSumS0(d, s) : (((x) == 1) ? BfSumS1(d, s) : \
  55.     (((x) == 2) ? BfSumS2(d, s) : (((x) == 3) ? BfSumS3(d, s) :    \
  56.     BfSumS4(d, s)))))
  57.  
  58. #define BfRx(x, d, s)   ((s) - BfSumSx(x, d, s))
  59.  
  60. #define BfQx(x, d, s) (8 - (BfDx(x, d) + BfSx(x, d, s)))
  61.  
  62. #define BfVx(x, d, s, v) \
  63.     ((((v) >> BfRx(x, d, s)) & BfMask(BfSx(x, d, s))) << BfQx(x, d, s))
  64.  
  65. #define BfZx(ptr, x, d, s) \
  66.     (((volatile unsigned char *) ptr)[(x)] & BfVx(x, d, s, 0xffffffff))
  67.  
  68. #define BfSetx(ptr, x, d, s, v)  {            \
  69.     ((volatile unsigned char *) ptr)[(x)] &= BfVx(x, d, s, 0xffffffff); \
  70.     ((volatile unsigned char *) ptr)[(x)] |= BfVx(x, d, s, v); \
  71. }
  72.  
  73. #define Bf_Set(ptr, d, s, v)  {                    \
  74.     BfSetx(ptr, 0, d, s, v);                    \
  75.     if (BfRx(0, d, s) > 0) {                    \
  76.     BfSetx(ptr, 1, d, s, v);                \
  77.     if (BfRx(1, d, s) > 0) {                \
  78.         BfSetx(ptr, 2, d, s, v);                \
  79.         if (BfRx(2, d, s) > 0) {                \
  80.         BfSetx(ptr, 3, d, s, v);            \
  81.         if (BfRx(3, d, s) > 0) {            \
  82.             BfSetx(ptr, 4, d, s, v);            \
  83.         }                        \
  84.         }                            \
  85.     }                            \
  86.     }                                \
  87. }
  88.  
  89. #define BfTestx(ptr, x, d, s, v) \
  90.     (BfZx(ptr, x, d, s) == BfVx(x, d, s, v))
  91.  
  92. #define Bf_Test(ptr, d, s, v)                     \
  93.     ((BfRx(0, d, s) <= 0) ?                     \
  94.     (BfTestx(ptr, 0, d, s, v)) :                 \
  95.     ((BfRx(1, d, s) <= 0) ?                    \
  96.         (BfTestx(ptr, 0, d, s, v) &&            \
  97.         BfTestx(ptr, 1, d, s, v)) :                \
  98.         ((BfRx(2, d, s) <= 0) ?                \
  99.         (BfTestx(ptr, 0, d, s, v) &&            \
  100.         BfTestx(ptr, 1, d, s, v) &&            \
  101.         BfTestx(ptr, 2, d, s, v)) :             \
  102.         ((BfRx(3, d, s) <= 0) ?                \
  103.             (BfTestx(ptr, 0, d, s, v) &&        \
  104.             BfTestx(ptr, 1, d, s, v) &&            \
  105.             BfTestx(ptr, 2, d, s, v) &&            \
  106.             BfTestx(ptr, 3, d, s, v)) :            \
  107.             (BfTestx(ptr, 0, d, s, v) &&        \
  108.             BfTestx(ptr, 1, d, s, v) &&            \
  109.             BfTestx(ptr, 2, d, s, v) &&            \
  110.             BfTestx(ptr, 3, d, s, v) &&            \
  111.             BfTestx(ptr, 4, d, s, v))))))
  112.  
  113.  
  114. #define Bf_Get(ptr, d, s, valuePtr)                     \
  115.     ((*(valuePtr)) =                             \
  116.     ((BfRx(0, d, s) == 0) ?                     \
  117.         (BfZx(ptr, 0, d, s) >> BfQx(0, d, s)) :             \
  118.         ((BfZx(ptr, 0, d, s) << BfRx(0, d, s)) |            \
  119.         ((BfRx(1, d, s) == 0) ?                       \
  120.         (BfZx(ptr, 1, d, s) >> BfQx(1, d, s)) :         \
  121.         ((BfZx(ptr, 1, d, s) << BfRx(1, d, s)) |        \
  122.         ((BfRx(2, d, s) == 0) ?                   \
  123.             (BfZx(ptr, 2, d, s) >> BfQx(2, d, s)) :        \
  124.             ((BfZx(ptr, 2, d, s) << BfRx(2, d, s)) |        \
  125.             ((BfRx(3, d, s) == 0) ?                \
  126.             (BfZx(ptr, 3, d, s) >> BfQx(3, d, s)) :        \
  127.             ((BfZx(ptr, 3, d, s) << BfRx(3, d, s)) |        \
  128.             (BfZx(ptr, 4, d, s) >> BfQx(4, d, s)))))))))))
  129.  
  130. #endif /* _BF */
  131.  
  132.